#include "mydevice.h"
#include "../rgb/rgb.h"

#include "pinctrl.h"
#include "soc_osal.h"
#include "uart.h"
#include "watchdog.h"
#include "osal_debug.h"
#include "cmsis_os2.h"
#include "app_init.h"
#include "gpio.h"

char ligBuffer[10]={0};
char soilHum[10]={0};
char humidity[10]={0};
char temperature[10]={0};

void uart_gpio_init(uint16_t uart_bus,uint16_t uart_tx,uint16_t uart_rx )
{
    if(uart_bus==1||uart_bus==0){
        uapi_pin_set_mode(uart_tx, PIN_MODE_1);
        uapi_pin_set_mode(uart_rx, PIN_MODE_1);
    }
    else if(uart_bus==2){
        uapi_pin_set_mode(uart_tx, PIN_MODE_2);
        uapi_pin_set_mode(uart_rx, PIN_MODE_2);
    }
}
// 初始化 UART 配置
void uart_init_config(uint16_t uart_bus,uint16_t uart_tx,uint16_t uart_rx,uart_buffer_config_t* buff_config)
{
    // 定义一个 uart_attr_t 类型的结构体变量 attr，用于存储 UART 的属性
    uart_attr_t attr = {
        .baud_rate = UART_BAUDRATE, .data_bits = UART_DATA_BITS, .stop_bits = UART_STOP_BITS, .parity = UART_PARITY_BIT};

    uart_pin_config_t pin_config = {.tx_pin = uart_tx, .rx_pin = uart_rx, .cts_pin = PIN_NONE, .rts_pin = PIN_NONE};
    uapi_uart_deinit(uart_bus);
    int ret = uapi_uart_init(uart_bus, &pin_config, &attr, NULL, buff_config);
    if (ret != 0) {
        printf("uart init failed ret = %02x\n", ret);
    }
}

void init_water(void){
    uapi_pin_set_mode(CONFIG_WATER, PIN_MODE_0);
    uapi_gpio_set_dir(CONFIG_WATER, GPIO_DIRECTION_OUTPUT);
    uapi_gpio_set_val(CONFIG_WATER, GPIO_LEVEL_HIGH);
}
void water_control(bool flag){
    if(flag)
        uapi_gpio_set_val(CONFIG_WATER, GPIO_LEVEL_LOW);
    else
        uapi_gpio_set_val(CONFIG_WATER, GPIO_LEVEL_HIGH);
}
void init_fan(void){
    uapi_pin_set_mode(CONFIG_FAN_A, PIN_MODE_0);
    uapi_gpio_set_dir(CONFIG_FAN_A, GPIO_DIRECTION_OUTPUT);
    uapi_gpio_set_val(CONFIG_FAN_A, GPIO_LEVEL_LOW);
    uapi_pin_set_mode(CONFIG_FAN_B, PIN_MODE_0);
    uapi_gpio_set_dir(CONFIG_FAN_B, GPIO_DIRECTION_OUTPUT);
    uapi_gpio_set_val(CONFIG_FAN_B, GPIO_LEVEL_LOW);
}
void set_fan_in(void){
    uapi_gpio_set_val(CONFIG_FAN_B, GPIO_LEVEL_LOW);
    uapi_gpio_set_val(CONFIG_FAN_A, GPIO_LEVEL_HIGH);
}
void set_fan_out(void){
    uapi_gpio_set_val(CONFIG_FAN_A, GPIO_LEVEL_LOW);
    uapi_gpio_set_val(CONFIG_FAN_B, GPIO_LEVEL_HIGH);
}
void set_fan_stop(void){
    uapi_gpio_set_val(CONFIG_FAN_A, GPIO_LEVEL_LOW);
    uapi_gpio_set_val(CONFIG_FAN_B, GPIO_LEVEL_LOW);
}
void light_data_treating(uint8_t ch, uint32_t *buffer, uint32_t length, bool *next,SensorData* Data)
{
    UNUSED(next);
    for (uint32_t i = 0; i < length; i++)
    {
        float voltage_mv = buffer[i]; // 获取电压值（单位：mV）

        float lux = (VREF - voltage_mv) / 33.0f;

        // 限制Lux值范围
        if (lux > 1000.0f)
        {
            lux = 1000.0f;
        }
        else if(lux<0.0f)
            lux=0.0f;
        
        sprintf(Data->ligBuffer, "%.2f", lux);
        
    }
}


void soilHum_data_treating(uint8_t ch, uint32_t *buffer, uint32_t length, bool *next, SensorData* Data)
{
    UNUSED(next);
    for (uint32_t i = 0; i < length; i++)
    {
        float voltage_mv = buffer[i]; // 获取电压值（单位：mV）

        float lux = voltage_mv / 33.0f;

        // 限制Lux值范围
        if (lux > 1000.0f)
        {
            lux = 1000.0f;
        }
        else if(lux<0.0f)
            lux=0.0f;
        
        sprintf(Data->soilHum, "%.2f", lux);
        
    }
}
void control(ControlState* conData){
    // 控制风扇
    if(conData->fanFlag[0] == '1'){  // 假设 fanFlag 是字符串，例如 "1" 表示开启
        set_fan_in();
        osal_printk("openfan\r\n");
    }
    else{
        set_fan_stop();
    }

    // 控制水泵
    if(conData->waterFlag[0] == '1'){  // 假设 waterFlag 是字符串，例如 "1" 表示开启
        uapi_gpio_set_val(CONFIG_WATER, GPIO_LEVEL_LOW);    
    }
    else{
        uapi_gpio_set_val(CONFIG_WATER, GPIO_LEVEL_HIGH);
    }

    // 可以根据需要添加更多控制逻辑，例如太阳灯、开关等
    // 控制太阳灯
    if(conData->sunFlag[0] == '1'){  // 假设 sunFlag 是字符串，例如 "1" 表示开启
        // 控制 RGB 灯
        if(conData->colorNum[0][0] != '\0' && conData->colorNum[1][0] != '\0' && conData->colorNum[2][0] != '\0'){
        int r = atoi(conData->colorNum[0]);  // 将字符串转换为整数
        int g = atoi(conData->colorNum[1]);
        int b = atoi(conData->colorNum[2]);
        RGB_SetColor(r, g, b);
    }
    }
    else{
        RGB_Deinit();
    }

    // 控制开关
    if(conData->switchFlag[0] == '1'){  // 假设 switchFlag 是字符串，例如 "1" 表示开启
        // 添加控制开关开启的代码
    }
    else{
        // 添加控制开关关闭的代码
    }

    
}